package br.com.sisat.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.AgendaDTO;
import br.com.sisat.modelo.HorarioAtendimentoDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.UtilDatas;

public class HorarioAtendimentoDAO {

	private static HorarioAtendimentoDAO dao;
	
	public static HorarioAtendimentoDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new HorarioAtendimentoDAO();
		}
		return dao;
	}

	private static void preecherPK (HorarioAtendimentoDTO horario, Connection conn)throws Exception{
		String sql = "select nextval ('sat.horario_id_horario')";
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		rs.next();
		horario.setIdHorarioAtendimento(rs.getLong(1));
	} 
	
	
	public static void incluirHorarioAtendimento(HorarioAtendimentoDTO horarioAtendimento) throws Exception {
		String sql = "INSERT INTO " +
					 "sat.horario_atendimento(id_terapeuta, dia, id_horario_atendimento, inicio, fim)" +
					 "VALUES (?, ?, ?, ?, ?);";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		preecherPK(horarioAtendimento, conn);
		ps.setLong(index++, horarioAtendimento.getIdTerapeuta());
		ps.setLong(index++, horarioAtendimento.getDia());
		ps.setLong(index++, horarioAtendimento.getIdHorarioAtendimento());
		ps.setString	(index++, horarioAtendimento.getHorarioInicio());
		ps.setString	(index++, horarioAtendimento.getHorarioFim());
		ps.executeUpdate();
		conn.commit();
	}
	
	public static void excluirHorarioAtendimento(HorarioAtendimentoDTO horario) throws Exception{
		String sql = "DELETE FROM sat.horario_atendimento WHERE id_horario_atendimento = ?;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		ps.setLong(index++, horario.getIdHorarioAtendimento());
		ps.executeUpdate();
		conn.commit();
		ps.close();
	}

	public List<HorarioAtendimentoDTO> recuperarLista(Long idTerapeuta) throws Exception {
		List<HorarioAtendimentoDTO> horarios = new ArrayList<HorarioAtendimentoDTO>();
		String sql = "SELECT pessoa.nome, horario.id_terapeuta, horario.dia, " +
				     "horario.id_horario_atendimento, horario.inicio, horario.fim " +
				     "FROM sat.horario_atendimento horario " +
				     "join sat.terapeuta terapeuta on (horario.id_terapeuta = terapeuta.id_terapeuta) " +
				     "join sat.pessoa pessoa on (pessoa.id_pessoa = terapeuta.id_pessoa) " +
				     "WHERE terapeuta.id_terapeuta = ? "+
				     "order by horario.dia, horario.inicio";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setLong(1, idTerapeuta);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			HorarioAtendimentoDTO horario = new HorarioAtendimentoDTO();
			horario.setNomeTerapeuta(rs.getString("nome"));
			horario.setIdHorarioAtendimento(rs.getLong("id_terapeuta"));
			horario.setDia(rs.getLong("dia"));
			horario.setIdHorarioAtendimento(rs.getLong("id_horario_atendimento"));
			horario.setHorarioInicio(rs.getString("inicio"));
			horario.setHorarioFim(rs.getString("fim"));
			horarios.add(horario);
		}
		ps.close();
		return horarios;
	}

	public List<HorarioAtendimentoDTO> consultar(AgendaDTO agenda) throws Exception {
		List<HorarioAtendimentoDTO> horarios = new ArrayList<HorarioAtendimentoDTO>();
		String sql = "SELECT atendimento.id_terapeuta, atendimento.dia, " +
					 "atendimento.id_horario_atendimento, atendimento.inicio, " +
					 "atendimento.fim " +
					 "FROM sat.horario_atendimento  atendimento " +
					 "join sat.terapeuta terapeuta on (atendimento.id_terapeuta = terapeuta.id_terapeuta) " +
					 "where 1=1 ";
		if(!ObjectUtil.isEmpty(agenda.getNuTerapeuta()) && agenda.getNuTerapeuta() != 0){
			sql =  sql + " and terapeuta.id_terapeuta = " + agenda.getNuTerapeuta().toString();
		}
		if(!ObjectUtil.isEmpty(agenda.getNuEspecialidade()) && agenda.getNuEspecialidade() != 0){
			sql =  sql + " and terapeuta.id_especialidade = " + agenda.getNuEspecialidade().toString();
		}
		if(!ObjectUtil.isEmpty(agenda.getDtConsulta())){
			int i = UtilDatas.diaDaSemana(agenda.getDtConsulta());
			sql =  sql + " and atendimento.dia = " + i;
		}
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			HorarioAtendimentoDTO horario = new HorarioAtendimentoDTO();
			horario.setIdHorarioAtendimento(rs.getLong("id_terapeuta"));
			horario.setDia(rs.getLong("dia"));
			horario.setIdHorarioAtendimento(rs.getLong("id_horario_atendimento"));
			horario.setHorarioInicio(rs.getString("inicio"));
			horario.setHorarioFim(rs.getString("fim"));
			horarios.add(horario);
		}
		ps.close();
		return horarios;
	}
}
